home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_11_05
/
1105068a
< prev
next >
Wrap
Text File
|
1993-03-07
|
2KB
|
59 lines
#include <math.h>
#define SWAP(a,b) tempr=a;a=b;b=tempr
void four1(float *data, int *nn, int *isign)
{ /* altered for consistency
* with original FORTRAN */
/* Press, Flannery, Teukolsky, Vettering "Numerical
* Recipes in C" tuned up ; Code works only when *nn is
* a power of 2 */
int n, mmax, m, j, i;
double wtemp, wr, wpr, wpi, wi, theta, wpin;
float tempr, tempi, datar, datai;
n = *nn * 2;
j = 0;
for (i = 0; i < n; i += 2) {
if (j > i) { /* could use j>i+1 to help
* compiler analysis */
SWAP(data[j], data[i]);
SWAP(data[j + 1], data[i + 1]);
}
m = *nn;
while (m >= 2 && j >= m) {
j -= m;
m >>= 1;
}
j += m;
}
theta = 3.141592653589795 * .5;
if (*isign < 0)
theta = -theta;
wpin = 0; /* sin(+-PI) */
for (mmax = 2; n > mmax; mmax *= 2) {
wpi = wpin;
wpin = sin(theta);
wpr = 1 - wpin * wpin - wpin * wpin; /* cos(theta*2) */
theta *= .5;
wr = 1;
wi = 0;
for (m = 0; m < mmax; m += 2) {
for (i = m; i < n; i += mmax * 2) {
j = i + mmax;
/* mixed precision not significantly more
* accurate here; if removing float casts,
* tempr and tempi should be double */
tempr = (float) wr *data[j] - (float) wi *data[j + 1];
tempi = (float) wr *data[j + 1] + (float) wi *data[j];
/* don't expect compiler to analyze j >
* i+1; original code stored data[j..]
* first and avoided using data[ri] */
data[i] = (datar = data[i]) + tempr;
data[i + 1] = (datai = data[i + 1]) + tempi;
data[j] = datar - tempr;
data[j + 1] = datai - tempi;
}
wr = (wtemp = wr) * wpr - wi * wpi;
wi = wtemp * wpi + wi * wpr;
}
}
}